#pragma once

namespace jxh {
	template<class K,class V>
	class map {
		typedef RBTreeNode<pair<K,V>> Node;
		struct keyofvalue {
			const K& operator()(const pair<K,V>& kv) {
				return kv.first;
			}
		};
		void _inorder(Node* root) {
			if (root == nullptr)return;
			_inorder(root->_left);
			cout << root->_data.first<<" "<<root->_data.second << endl;
			_inorder(root->_right);
		}
	public:

		//typedef RBTreeIterator<pair<K,V>> iterator;
		typedef typename RBTree<K, pair<const K, V>, keyofvalue>::iterator iterator;
		typedef typename RBTree<K, pair<const K, V>, keyofvalue>::const_iterator const_iterator;

		const_iterator begin()const {
			return _t.begin();
		}
		const_iterator end() const{
			return _t.end();
		}
		iterator begin() {
			return _t.begin();
		}
		iterator end() {
			return _t.end();
		}

		pair<iterator, bool> insert(const pair<K, V>& kv)
		{
			return _t.insert(kv);
		}

		iterator find(const K& key)
		{
			return _t.find(key);
		}

		V& operator[](const K& key)
		{
			pair<iterator, bool> ret = insert(make_pair(key, V()));
			return ret.first->second;
		}

		void inorder() {
			_inorder(_t.getroot());
		}
	private:
		RBTree<K, pair<const K,V>, keyofvalue> _t;
	};


	//template<class K, class V>
	//class map
	//{
	//	struct MapKeyOfT
	//	{
	//		const K& operator()(const pair<K, V>& kv)
	//		{
	//			return kv.first;
	//		}
	//	};
	//public:
	//	typedef typename RBTree<K, pair<const K, V>, MapKeyOfT>::iterator iterator;
	//	typedef typename RBTree<K, pair<const K, V>, MapKeyOfT>::const_iterator const_iterator;

	//	iterator begin()
	//	{
	//		return _t.begin();
	//	}

	//	iterator end()
	//	{
	//		return _t.end();
	//	}

	//	const_iterator begin() const
	//	{
	//		return _t.begin();
	//	}

	//	const_iterator end() const
	//	{
	//		return _t.end();
	//	}

	//	pair<iterator, bool> insert(const pair<K, V>& kv)
	//	{
	//		return _t.Insert(kv);
	//	}

	//	iterator find(const K& key)
	//	{
	//		return _t.Find(key);
	//	}

	//	V& operator[](const K& key)
	//	{
	//		pair<iterator, bool> ret = insert(make_pair(key, V()));
	//		return ret.first->second;
	//	}

	//private:
	//	RBTree<K, pair<const K, V>, MapKeyOfT> _t;
	//};

}
